package pe.gob.mintra.trabajadoreshogar.action;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.view.JasperViewer;

import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import pe.gob.mintra.trabajadoreshogar.bean.DatLab;
import pe.gob.mintra.trabajadoreshogar.bean.DetalleMotivoCese;
import pe.gob.mintra.trabajadoreshogar.bean.Empleador;
import pe.gob.mintra.trabajadoreshogar.bean.Empresa;
import pe.gob.mintra.trabajadoreshogar.bean.Liquidacion;
import pe.gob.mintra.trabajadoreshogar.bean.MotivoCese;
import pe.gob.mintra.trabajadoreshogar.bean.ParametrosBusqueda;
import pe.gob.mintra.trabajadoreshogar.bean.Sucursal;
import pe.gob.mintra.trabajadoreshogar.bean.TipoDocumentoIdentidad;
import pe.gob.mintra.trabajadoreshogar.bean.Trabajador;
import pe.gob.mintra.trabajadoreshogar.bean.Usuario;
import pe.gob.mintra.trabajadoreshogar.funciones.Funciones;
import pe.gob.mintra.trabajadoreshogar.service.DatLabService;
import pe.gob.mintra.trabajadoreshogar.service.EmpleadorService;
import pe.gob.mintra.trabajadoreshogar.service.EmpresaService;
import pe.gob.mintra.trabajadoreshogar.service.GratificacionService;
import pe.gob.mintra.trabajadoreshogar.service.MantenimientoService;
import pe.gob.mintra.trabajadoreshogar.service.SucursalService;
import pe.gob.mintra.trabajadoreshogar.service.TrabajadorService;
import pe.gob.mintra.trabajadoreshogar.service.UsuarioService;
import pe.gob.mintra.trabajadoreshogar.service.VacacionService;
import pe.gob.mintra.trabajadoreshogar.util.Utilitario;

@ManagedBean(name = "busquedaAction")
@SessionScoped
public class BusquedaAction {

	private List<TipoDocumentoIdentidad> lstTipoDocumentoIdentidad;

	private String tipoBusqueda;

	Funciones funciones = new Funciones();

	private MantenimientoService servicioMantenimiento = new MantenimientoService();
	private GratificacionService servicioGratificacion= new GratificacionService();
	private Utilitario objUtil= new Utilitario();
	private VacacionService servicioVacacion= new VacacionService();
	private EmpresaService servicioEmpresa = new EmpresaService();
	private UsuarioService servicioUsuario = new UsuarioService();

	private DatLabService servicioDatLab = new DatLabService();
	private SucursalService servicioSucursal = new SucursalService();

	private List<Liquidacion> lstLiquidacion = null;

	private Liquidacion liquidacionSeleccionada = new Liquidacion();
	private boolean muestraBotones = false;
	private boolean muestraDatosCtsDeshabilitados = false;
	
	private ParametrosBusqueda paramBusquedaReporte= new ParametrosBusqueda();

	@ManagedProperty(name = "objDatLab", value = "#{objDatLab}")
	private DatLab objDatLab = null;
	@ManagedProperty("#{usuarioAction.objUsuario}")
	private Usuario objUsuario;

	private DatLab objDatLabBusqueda = new DatLab();

	private ParametrosBusqueda paramBusqueda = new ParametrosBusqueda();

	private List<Usuario> lstLiquidadores = new ArrayList<Usuario>();

	@ManagedProperty("#{principalAction}")
	private PrincipalAction principalAction;

	public PrincipalAction getPrincipalAction() {
		return principalAction;
	}

	public void setPrincipalAction(PrincipalAction principalAction) {
		this.principalAction = principalAction;
	}

	public List<Usuario> getLstLiquidadores() {
		return lstLiquidadores;
	}

	public void setLstLiquidadores(List<Usuario> lstLiquidadores) {
		this.lstLiquidadores = lstLiquidadores;
	}

	public ParametrosBusqueda getParamBusqueda() {
		return paramBusqueda;
	}

	public void setParamBusqueda(ParametrosBusqueda paramBusqueda) {
		this.paramBusqueda = paramBusqueda;
	}
	
	

	public Usuario getObjUsuario() {
		return objUsuario;
	}

	public void setObjUsuario(Usuario objUsuario) {
		this.objUsuario = objUsuario;
	}

	public void seleccionarTipoBusqueda(AjaxBehaviorEvent event) {

		lstLiquidacion = new ArrayList<Liquidacion>();

		System.out.println(tipoBusqueda);

		if (tipoBusqueda.equals("L")) {
			lstLiquidadores = servicioUsuario.listarLiquidadores();
		}

		paramBusqueda = new ParametrosBusqueda();

	}

	public String getTipoBusqueda() {
		return tipoBusqueda;
	}

	public void setTipoBusqueda(String tipoBusqueda) {
		this.tipoBusqueda = tipoBusqueda;
	}

	public DatLab getObjDatLab() {
		return objDatLab;
	}

	public void setObjDatLab(DatLab objDatLab) {
		this.objDatLab = objDatLab;
	}

	public boolean isMuestraDatosCtsDeshabilitados() {
		return muestraDatosCtsDeshabilitados;
	}

	public void setMuestraDatosCtsDeshabilitados(
			boolean muestraDatosCtsDeshabilitados) {
		this.muestraDatosCtsDeshabilitados = muestraDatosCtsDeshabilitados;
	}

	public boolean isMuestraBotones() {
		return muestraBotones;
	}

	public void setMuestraBotones(boolean muestraBotones) {
		this.muestraBotones = muestraBotones;
	}

	public DatLab getObjDatLabBusqueda() {
		return objDatLabBusqueda;
	}

	public void setObjDatLabBusqueda(DatLab objDatLabBusqueda) {
		this.objDatLabBusqueda = objDatLabBusqueda;
	}

	public Liquidacion getLiquidacionSeleccionada() {
		return liquidacionSeleccionada;
	}

	public void setLiquidacionSeleccionada(Liquidacion liquidacionSeleccionada) {
		this.liquidacionSeleccionada = liquidacionSeleccionada;
	}

	public List<TipoDocumentoIdentidad> getLstTipoDocumentoIdentidad() {
		return lstTipoDocumentoIdentidad;
	}

	public void setLstTipoDocumentoIdentidad(
			List<TipoDocumentoIdentidad> lstTipoDocumentoIdentidad) {
		this.lstTipoDocumentoIdentidad = lstTipoDocumentoIdentidad;
	}

	public List<Liquidacion> getLstLiquidacion() {
		return lstLiquidacion;
	}

	public void setLstLiquidacion(List<Liquidacion> lstLiquidacion) {
		this.lstLiquidacion = lstLiquidacion;
	}

	public BusquedaAction() {
		lstLiquidacion = new ArrayList<Liquidacion>();
		tipoBusqueda = "E";

	}

	public String inicializaBusqueda() {

		lstTipoDocumentoIdentidad = new ArrayList<TipoDocumentoIdentidad>();
		lstTipoDocumentoIdentidad = servicioMantenimiento
				.listarTipoDocumentoIdentidad();
		lstLiquidacion = new ArrayList<Liquidacion>();
		muestraBotones = false;

		return "pretty:busquedaLiquidaciones";
	}

	public void buscarLiquidaciones() {

		Date fechaActual = new Date();

		System.out.println("ENTRA A BUSQUEDA ");
		System.out.println("TIPO DE BUSQUEDA--> " + tipoBusqueda);

		System.out.println("CODTIPDOC " + paramBusqueda.getTipoDocumento());
		System.out.println("NUMDOC " + paramBusqueda.getNroDocumento());
		System.out.println("APEPATER " + paramBusqueda.getApePater());
		System.out.println("APEMATER " + paramBusqueda.getApeMater());
		System.out.println("NOMBRES " + paramBusqueda.getNombres());
		System.out.println("CODUSU "
				+ paramBusqueda.getCodLiquidadorSeleccionado());

		System.out.println("FECHA INICIO " + paramBusqueda.getFechaInicio());
		System.out.println("FECHA FIN " + paramBusqueda.getFechaFin());

		if (tipoBusqueda.equals("E") || tipoBusqueda.equals("T")) { //BUSQUEDA POR EMPLEADOR O TRABAJADOR
			
			paramBusqueda.setCodLiquidadorSeleccionado(objUsuario.getV_codusu());
			
			
			if (paramBusqueda.getNroDocumento().trim().equals("")) {
				paramBusqueda.setNroDocumento(null);
			}
			if (paramBusqueda.getApePater().trim().equals("")) {
				paramBusqueda.setApePater(null);
			}
			if (paramBusqueda.getApeMater().trim().equals("")) {
				paramBusqueda.setApeMater(null);
			}
			if (paramBusqueda.getNombres().trim().equals("")) {
				paramBusqueda.setNombres(null);
			}

			if (tipoBusqueda.equals("E")) {
				System.out.println("ENTRA A BUSQUEDA POR EMPLEADOR");
				lstLiquidacion = servicioDatLab
						.listarLiquidacionesxEmpleador(paramBusqueda);
				System.out.println("NRO DE ELEMENTIOS--z>"
						+ lstLiquidacion.size());
			} else if (tipoBusqueda.equals("T")) {

				lstLiquidacion = servicioDatLab
						.listarLiquidacionesxTrabajador(paramBusqueda);
			}

		}

		else if (tipoBusqueda.equals("F")) { //BUSQUEDA POR RANGO DE FECHAS
			
			paramBusqueda.setCodLiquidadorSeleccionado(objUsuario.getV_codusu());
			
			FacesMessage msgValFecha = null;

			if (paramBusqueda.getFechaInicio().after(
					paramBusqueda.getFechaFin())) {

				msgValFecha = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						"La fecha de inicio no puede ser mayor que la fecha de fin",
						null);
				FacesContext.getCurrentInstance().addMessage(null, msgValFecha);

			} else if (paramBusqueda.getFechaInicio().after(fechaActual)) {

				msgValFecha = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						"La fecha de inicio no puede ser mayor que la fecha actual",
						null);
				FacesContext.getCurrentInstance().addMessage(null, msgValFecha);

			} else {
				lstLiquidacion = servicioDatLab
						.listarLiquidacionesxRangoFechas(paramBusqueda);
			}

		} else { //BUSQUEDA POR LIQUIDADOR
			lstLiquidacion = servicioDatLab
					.listarLiquidacionesxTrabajador(paramBusqueda);
		}

		paramBusqueda = new ParametrosBusqueda();

	}

	public void seleccionar(SelectEvent event) {

		System.out.println("LIQUIDACION "
				+ liquidacionSeleccionada.getN_cordatlab());

		muestraBotones = true;
	}

	private boolean muestraBotonIdem = false;

	public boolean isMuestraBotonIdem() {
		return muestraBotonIdem;
	}

	public void setMuestraBotonIdem(boolean muestraBotonIdem) {
		this.muestraBotonIdem = muestraBotonIdem;
	}

	EmpleadorService servicioEmpleador = new EmpleadorService();
	TrabajadorService servicioTrabajador = new TrabajadorService();

	public String editarLiquidacion() {

		objDatLab.setN_cordatlab(liquidacionSeleccionada.getN_cordatlab());
		objDatLab.setD_fecing(liquidacionSeleccionada.getD_fecing());
		objDatLab.setD_fecces(liquidacionSeleccionada.getD_fecces());
		objDatLab.setN_montotgra(liquidacionSeleccionada.getN_montotgra());
		objDatLab.setN_montotvac(liquidacionSeleccionada.getN_montotvac());
		objDatLab.setN_montotcts(liquidacionSeleccionada.getN_montotcts());
		objDatLab.setN_montotind(liquidacionSeleccionada.getN_montotind());
		objDatLab.setN_coremp(liquidacionSeleccionada.getN_coremp());
		objDatLab.setN_cordetmot(liquidacionSeleccionada.getN_cordetmot());
		objDatLab.setV_otrcon(liquidacionSeleccionada.getV_otrcon());
		objDatLab.setN_otrcon(liquidacionSeleccionada.getN_otrcon());
		objDatLab.setV_observacion(liquidacionSeleccionada.getV_observacion());
		objDatLab.setV_flgest(liquidacionSeleccionada.getV_flgest());
		

		System.out.println("CODIGO DETALLE MOTIVO CESE "
				+ liquidacionSeleccionada.getN_cordetmot());

		principalAction.setNroDocumentoTrabPrin(liquidacionSeleccionada
				.getV_numdoc());
		principalAction.setLstTipoDocumentoIdentidadPrin(servicioMantenimiento
				.listarTipoDocumentoIdentidadTrab());
		principalAction
				.setObjTipoDocumentoIdentidadTrabPrin(new TipoDocumentoIdentidad());
		principalAction.getObjTipoDocumentoIdentidadTrabPrin().setV_codtdocide(
				liquidacionSeleccionada.getV_codtdocide());
		principalAction.setObjTrabajadorPrin(new Trabajador());
		principalAction.getObjTrabajadorPrin().setV_trabajador(
				liquidacionSeleccionada.getV_apepater()
						+ liquidacionSeleccionada.getV_apemater() + " "
						+ liquidacionSeleccionada.getV_nombres());
		principalAction.getObjTrabajadorPrin().setV_codtdocide(
				liquidacionSeleccionada.getV_codtdocide());
		principalAction.getObjTrabajadorPrin().setV_numdoc(
				liquidacionSeleccionada.getV_numdoc());
		principalAction.setObjSucursalTrab(new Sucursal());
		principalAction.getObjSucursalTrab().setN_codsuc(
				liquidacionSeleccionada.getN_numcordom());
		principalAction.getObjTrabajadorPrin().setObjSucursalTrab(
				principalAction.getObjSucursalTrab());

		System.out.println("CODIGO SUCURSAL "
				+ liquidacionSeleccionada.getN_numcordom());
		
		Empleador objEmpleadorTrab = new Empleador();		
		objEmpleadorTrab.setV_codtdocide(liquidacionSeleccionada
				.getV_codtdocide());
		objEmpleadorTrab.setV_numdoc(liquidacionSeleccionada.getV_numdoc());
		
		principalAction.setLstSucursalTrab(servicioSucursal
				.listarSucursalDomicilio(objEmpleadorTrab));

		principalAction.setNroDocumentoEmple(liquidacionSeleccionada
				.getV_numdocemple());
		principalAction.setLstTipoDocumentoIdentidadEmple(servicioMantenimiento
				.listarTipoDocumentoIdentidad());
		principalAction
				.setObjTipoDocumentoIdentidadEmple(new TipoDocumentoIdentidad());
		principalAction.getObjTipoDocumentoIdentidadEmple().setV_codtdocide(
				liquidacionSeleccionada.getV_codtdocideemple());
		principalAction.setObjEmpleadorPrin(new Empleador());

		principalAction.getObjEmpleadorPrin().setV_razsoc(
				liquidacionSeleccionada.getV_apepaterempre()
						+ liquidacionSeleccionada.getV_apematerempre() + " "
						+ liquidacionSeleccionada.getV_nombresempre());
		
		principalAction.getObjEmpleadorPrin().setV_codtdocide(
				liquidacionSeleccionada.getV_codtdocideemple());
		principalAction.getObjEmpleadorPrin().setV_numdoc(
				liquidacionSeleccionada.getV_numdocemple());
		
		
		ParametrosBusqueda objParam = new ParametrosBusqueda();
		objParam.setTipoDocumento(liquidacionSeleccionada.getV_codtdocide());
		objParam.setNroDocumento(liquidacionSeleccionada.getV_numdoc());
		principalAction.setLstLiqTrab(servicioDatLab.listarLiquidacionesxTrabajador(objParam));

		

		System.out
				.println("CORRELATIVO EMPRESA SELECCIONADA principalAction.getObjEmpleadorPrin().getN_coremp "
						+ principalAction.getObjEmpleadorPrin().getN_coremp());

		principalAction.setObjSucursalEmple(new Sucursal());
		principalAction.getObjSucursalEmple().setN_codsuc(
				liquidacionSeleccionada.getN_codsuc());
		Empleador objEmpleador = new Empleador();
		objEmpleador.setV_codtdocide(liquidacionSeleccionada
				.getV_codtdocideemple());
		objEmpleador.setV_numdoc(liquidacionSeleccionada.getV_numdocemple());
		principalAction.setLstSucursalEmple(servicioSucursal
				.listarSucursalDomicilio(objEmpleador));
		
		MotivoCese objMotCes= new MotivoCese();
		
		if(liquidacionSeleccionada.getN_cordetmot() >= 3){
			objMotCes.setN_cormot(3);
			principalAction.setObjMotivoCese(objMotCes);
			
			principalAction.setMuestraComboDetalleMotivoCese(true);
			
			principalAction.setLstDetalleMotivoCese(servicioMantenimiento.listarDetalleMotivoCese(objMotCes));
			
			principalAction.getObjDetalleMotivoCese().setN_cordetmot(liquidacionSeleccionada.getN_cordetmot());
			
		}else{
			objMotCes.setN_cormot(liquidacionSeleccionada.getN_cordetmot());
			principalAction.setObjMotivoCese(objMotCes);
			
			principalAction.setMuestraComboDetalleMotivoCese(false);
		}
		
		
		
		if (liquidacionSeleccionada.getN_cordetmot() == 2) {
			muestraBotonIdem = true;
			principalAction.setMuestraBotonTerminacionContrato(true);
		} else {
			muestraBotonIdem = false;
			principalAction.setMuestraBotonTerminacionContrato(false);
		}

		muestraDatosCtsDeshabilitados = true;

		// HABILITA BOTONES
		principalAction.setActivaBotonGrabar(false);
		principalAction.setMuestraBotonCalculo(false);

		return "pretty:principal";

	}

	public String nuevaLiquidacion() {
		System.out.println("NUEVA LIQ");

		return "pretty:principal";
	}

	public String volverLiquidacion() {
		buscarLiquidaciones();

		return "pretty:busquedaLiquidaciones";

	}
	
	private String formulario="P";
	private String tipo="R";

	public String getFormulario() {
		return formulario;
	}

	public void setFormulario(String formulario) {
		this.formulario = formulario;
	}
	
	

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public void printReport() throws JRException, IOException {

		try {
			String path = null;
			
			if(tipo.equals("R")){
				path = "/reportes/rpt_calculos.jrxml";
			}else{
				path = "/reportes/rpt_concil.jrxml";
			}
			
			InputStream jasperTemplate = FacesContext.getCurrentInstance()
					.getExternalContext().getResourceAsStream(path);
			JasperReport jasperReport = JasperCompileManager
					.compileReport(jasperTemplate);
			
			
			List<Liquidacion> lstLiq = new ArrayList<Liquidacion>();
			Map parameters = new HashMap();
			
			
			//System.out.println("RUTA----> "+ FacesContext.getCurrentInstance().getExternalContext().getResource("/reportes/"));
			
			System.out.println("objDatLab.getN_cordatlab()-->>"+objDatLab.getN_cordatlab());
			
			
			
			DatLab dl= new DatLab();
			if(formulario.equals("B")){
				dl.setN_cordatlab(liquidacionSeleccionada.getN_cordatlab());
				lstLiq = servicioDatLab.listarLiquidacionesxDatLab(dl);
			}else{
				dl.setN_cordatlab(objDatLab.getN_cordatlab());
				lstLiq = servicioDatLab.listarLiquidacionesxDatLab(dl);
			}


			ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			parameters.put("SUBREPORT_DIR", servletContext.getRealPath("reportes").toString()+"/");
			parameters.put("DS_GRATI", new JRBeanCollectionDataSource(servicioGratificacion.lstGratiReporte(dl)));
			parameters.put("DS_VAC", new JRBeanCollectionDataSource(servicioVacacion.lstVacacionReporte(dl)));
			parameters.put("fechaActual", objUtil.fechaEnLetras());
			
			
			
			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
					lstLiq);

			JasperPrint jasperPrint = JasperFillManager.fillReport(
					jasperReport, parameters,ds);
			HttpServletResponse response = (HttpServletResponse) FacesContext
					.getCurrentInstance().getExternalContext().getResponse();
			ServletOutputStream outputStream = response.getOutputStream();
			JasperExportManager.exportReportToPdfStream(jasperPrint,
					outputStream);
			outputStream.close();
			FacesContext.getCurrentInstance().renderResponse();
			FacesContext.getCurrentInstance().responseComplete();

		} catch (Exception e) {
			System.out.println("Error al mostrar reporte: " + funciones.readStackTrace(e));
		}
		
		

	}

	public ParametrosBusqueda getParamBusquedaReporte() {
		return paramBusquedaReporte;
	}

	public void setParamBusquedaReporte(ParametrosBusqueda paramBusquedaReporte) {
		this.paramBusquedaReporte = paramBusquedaReporte;
	}
	
	//GENERA REPORTE ATENCIONES DE TRABAJADORES POR GENERO
	private String tipoReporte=null;
	
	
	public String getTipoReporte() {
		return tipoReporte;
	}

	public void setTipoReporte(String tipoReporte) {
		this.tipoReporte = tipoReporte;
	}
	

	public void generarReporte(){
		
		
		try {
			
			String path= null;
			List<Liquidacion> lstLiq = new ArrayList<Liquidacion>();
			Map parameters = new HashMap();
			
			if(tipoReporte.equals("AGT")){
				path = "/reportes/atenxGenero.jrxml";
				lstLiq = servicioDatLab.generarReporteAtenxGen(paramBusquedaReporte);
				
			}else{
				path = "/reportes/atenxLiq.jrxml";
				lstLiq = servicioDatLab.generarReporteAtenxLiq(paramBusquedaReporte);
			}
						
			InputStream jasperTemplate = FacesContext.getCurrentInstance()
					.getExternalContext().getResourceAsStream(path);
			JasperReport jasperReport = JasperCompileManager
					.compileReport(jasperTemplate);
				
			
			parameters.put("d_fecini", paramBusquedaReporte.getFechaInicio());
			parameters.put("d_fecfin", paramBusquedaReporte.getFechaFin());
		
			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
					lstLiq);

			JasperPrint jasperPrint = JasperFillManager.fillReport(
					jasperReport, parameters,ds);
			HttpServletResponse response = (HttpServletResponse) FacesContext
					.getCurrentInstance().getExternalContext().getResponse();
			ServletOutputStream outputStream = response.getOutputStream();
			JasperExportManager.exportReportToPdfStream(jasperPrint,
					outputStream);
			outputStream.close();
			FacesContext.getCurrentInstance().renderResponse();
			FacesContext.getCurrentInstance().responseComplete();

		} catch (Exception e) {
			System.out.println("Error al mostrar reporte: " + funciones.readStackTrace(e));
		}
		
		
	}

	
	
	

}
